home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / crypto_func.inc < prev    next >
Text File  |  2005-03-31  |  11KB  |  414 lines

  1. # -*- Fundamental -*-
  2. #
  3. # (C) Tenable Network Security
  4. #
  5. # crypto_func.inc 
  6. # $Revision: 1.3 $
  7. #
  8.  
  9. #---------------------------------------------------------#
  10. # DES encryption code                                     #
  11. #---------------------------------------------------------#
  12.  
  13.  
  14. perm1 = raw_string (57, 49, 41, 33, 25, 17,  9,
  15.                      1, 58, 50, 42, 34, 26, 18,
  16.                     10,  2, 59, 51, 43, 35, 27,
  17.                     19, 11,  3, 60, 52, 44, 36,
  18.                     63, 55, 47, 39, 31, 23, 15,
  19.                      7, 62, 54, 46, 38, 30, 22,
  20.                     14,  6, 61, 53, 45, 37, 29,
  21.                     21, 13,  5, 28, 20, 12,  4 );
  22.  
  23.  
  24. perm2 = raw_string (14, 17, 11, 24,  1,  5,
  25.                      3, 28, 15,  6, 21, 10,
  26.                     23, 19, 12,  4, 26,  8,
  27.                     16,  7, 27, 20, 13,  2,
  28.                     41, 52, 31, 37, 47, 55,
  29.                     30, 40, 51, 45, 33, 48,
  30.                     44, 49, 39, 56, 34, 53,
  31.                     46, 42, 50, 36, 29, 32 );
  32.  
  33. perm3 = raw_string (58, 50, 42, 34, 26, 18, 10,  2,
  34.                     60, 52, 44, 36, 28, 20, 12,  4,
  35.                     62, 54, 46, 38, 30, 22, 14,  6,
  36.                     64, 56, 48, 40, 32, 24, 16,  8,
  37.                     57, 49, 41, 33, 25, 17,  9,  1,
  38.                     59, 51, 43, 35, 27, 19, 11,  3,
  39.                     61, 53, 45, 37, 29, 21, 13,  5,
  40.                     63, 55, 47, 39, 31, 23, 15,  7 );
  41.  
  42. perm4 = raw_string (32,  1,  2,  3,  4,  5,
  43.                      4,  5,  6,  7,  8,  9,
  44.                      8,  9, 10, 11, 12, 13,
  45.                     12, 13, 14, 15, 16, 17,
  46.                     16, 17, 18, 19, 20, 21,
  47.                     20, 21, 22, 23, 24, 25,
  48.                     24, 25, 26, 27, 28, 29,
  49.                     28, 29, 30, 31, 32,  1 );
  50.  
  51. perm5 = raw_string (16,  7, 20, 21,
  52.                     29, 12, 28, 17,
  53.                      1, 15, 23, 26,
  54.                      5, 18, 31, 10,
  55.                      2,  8, 24, 14,
  56.                     32, 27,  3,  9,
  57.                     19, 13, 30,  6,
  58.                     22, 11,  4, 25 );
  59.  
  60. perm6 = raw_string (40,  8, 48, 16, 56, 24, 64, 32,
  61.                     39,  7, 47, 15, 55, 23, 63, 31,
  62.                     38,  6, 46, 14, 54, 22, 62, 30,
  63.                     37,  5, 45, 13, 53, 21, 61, 29,
  64.                     36,  4, 44, 12, 52, 20, 60, 28,
  65.                     35,  3, 43, 11, 51, 19, 59, 27,
  66.                     34,  2, 42, 10, 50, 18, 58, 26,
  67.                     33,  1, 41,  9, 49, 17, 57, 25 );
  68.  
  69. sc = raw_string (1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1);
  70.  
  71. sbox =           raw_string (14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,
  72.                               0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,
  73.                               4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,
  74.                              15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13 ) +
  75.              raw_string (15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,
  76.                       3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,
  77.                   0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,
  78.                  13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9 ) +
  79.              raw_string (10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,
  80.                      13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,
  81.                  13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,
  82.                   1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12 ) +
  83.              raw_string ( 7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,
  84.                      13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,
  85.                  10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,
  86.                   3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14 ) +
  87.              raw_string ( 2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,
  88.                      14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,
  89.                   4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,
  90.                  11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3 ) +
  91.          raw_string (12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,
  92.                      10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,
  93.                   9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,
  94.                   4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13 ) +
  95.          raw_string ( 4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,
  96.                      13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,
  97.                   1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,
  98.                   6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12 ) +
  99.              raw_string (13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,
  100.                       1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,
  101.                   7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,
  102.                   2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11 );
  103.  
  104. function permute (in, p)
  105. {
  106.  local_var buf, i;
  107.  
  108.  buf = NULL;
  109.  for (i = 0; i < strlen(p); i++)
  110.     buf += in[ord(p[i]) - 1];
  111.  
  112.  return buf;
  113. }
  114.  
  115. function lshift (d, count)
  116. {
  117.  local_var buf, i;
  118.  
  119.  buf = NULL;
  120.  for (i = 0; i < strlen(d); i++)
  121.    buf += d[(i+count)%strlen(d)];
  122.   
  123.  return buf;
  124.  
  125. function xor (in1, in2)
  126. {
  127.  local_var buf, i;
  128.  
  129.  buf = NULL;
  130.  for (i = 0; i < strlen(in2); i++)
  131.    buf += raw_string (ord(in1[i]) ^ ord(in2[i]));
  132.  
  133.  return buf;
  134. }
  135.  
  136. function des_encrypt (in, key)
  137. {
  138.  local_var buff, i, j, k, c, d, cd, ki, pd1, l, r, rl, pk1;
  139.  local_var er, erk, b, cb, pcb, r2, tmp, val;
  140.  local_var m, n;
  141.  
  142.  buf = c = d = cb = NULL;
  143.  
  144.  pk1 = permute (in:key, p:perm1);
  145.  
  146.  c = substr (pk1, 0, 27);
  147.  d = substr (pk1, 28, 55);
  148.  
  149.  for (i = 0; i < 16; i++)
  150.  {
  151.   c = lshift (d:c, count:ord(sc[i]));
  152.   d = lshift (d:d, count:ord(sc[i]));
  153.  
  154.   cd = c + d;
  155.   ki[i] = permute (in:cd, p:perm2);
  156.  }
  157.  
  158.  pd1 = permute (in:in, p:perm3);
  159.  
  160.  l = substr(pd1, 0, 31);
  161.  r = substr(pd1, 32, 63);
  162.  
  163.  for (i = 0; i < 16; i++)
  164.  {
  165.   er = permute (in:r, p:perm4);
  166.   erk = xor (in1:er, in2:ki[i]);
  167.   
  168.   for (j = 0; j < 8; j++)
  169.     for (k = 0; k < 6; k++)
  170.       b[j*6 + k] = erk[j*6 + k];
  171.  
  172.   for (j = 0; j < 8; j++)
  173.   {
  174.    m = (ord(b[j*6 + 0]) << 1) | ord(b[j*6 + 5]);
  175.    n = (ord(b[j*6 + 1]) << 3) | (ord(b[j*6 + 2]) << 2) | (ord(b[j*6 + 3]) << 1) | ord(b[j*6 + 4]);
  176.  
  177.    for (k = 0; k < 4; k++)
  178.       if ((ord(sbox[j*4*16 + m*16 + n]) & (1<<(3-k))) == 0)
  179.         b[j*6 + k] = raw_string (0);
  180.       else
  181.         b[j*6 + k] = raw_string (1);
  182.   }
  183.  
  184.   cb = NULL;
  185.   for (j = 0; j < 8; j++)
  186.     for (k = 0; k < 4; k++)
  187.       cb += b[j*6 + k];
  188.  
  189.   pcb = permute (in:cb, p:perm5);
  190.  
  191.   r2 = xor (in1:l, in2:pcb);
  192.  
  193.   l = r;
  194.   r = r2;
  195.  }
  196.  
  197.  rl = r + l;
  198.  buf = permute (in:rl, p:perm6);
  199.  
  200.  return buf;
  201. }
  202.  
  203.  
  204. function str_to_key (str)
  205. {
  206.  local_var key, i;
  207.  
  208.  key = raw_string ( ((ord(str[0])>>1) << 1) ,
  209.                     ((((ord(str[0])&0x01)<<6) | (ord(str[1])>>2)) << 1) ,
  210.                     ((((ord(str[1])&0x03)<<5) | (ord(str[2])>>3)) << 1) ,
  211.                     ((((ord(str[2])&0x07)<<4) | (ord(str[3])>>4)) << 1) ,
  212.                     ((((ord(str[3])&0x0F)<<3) | (ord(str[4])>>5)) << 1) ,
  213.                     ((((ord(str[4])&0x1F)<<2) | (ord(str[5])>>6)) << 1) ,
  214.                     ((((ord(str[5])&0x3F)<<1) | (ord(str[6])>>7)) << 1) ,
  215.                     ((ord(str[6])&0x7F) << 1) );
  216.  
  217.  return key;
  218. }
  219.  
  220.  
  221. function DES (in, key)
  222. {
  223.  local_var inb, keyb, key2, outb, out, buff, i;
  224.  
  225.  key2 = str_to_key (str:key);
  226.  
  227.  for (i=0;i<64;i++)
  228.  {
  229.   if ((ord(in[i/8]) & (1<<(7-(i%8)))) == 0)
  230.     inb += raw_string (0);
  231.   else
  232.     inb += raw_string (1);
  233.     
  234.   if ((ord(key2[i/8]) & (1<<(7-(i%8)))) == 0)
  235.     keyb += raw_string (0);
  236.   else
  237.     keyb += raw_string (1);
  238.  }
  239.  
  240.  outb = des_encrypt(in:inb, key:keyb);
  241.  
  242.  for (i=0;i<8;i++)
  243.  {
  244.   out[i] = 0;
  245.  }
  246.  
  247.  for (i=0;i<64;i++) 
  248.  {
  249.   if (ord(outb[i]) == 1)
  250.     out[i/8] = out[i/8] | (1<<(7-(i%8)));
  251.  }
  252.  
  253.  for (i=0;i<8;i++)
  254.  {
  255.   buf += raw_string (out[i]);
  256.  }
  257.  
  258.  return buf;
  259. }
  260.  
  261.  
  262.  
  263. #---------------------------------------------------------#
  264. # LANMAN2.1 Challenge/Response                            #
  265. #---------------------------------------------------------#
  266.  
  267.  
  268. function LM_Hash (password)
  269. {
  270.  local_var len, pass, K1, K2, hash;
  271.  
  272.  len = strlen (password) & 14;
  273.  pass = substr (password, 0, len);
  274.  
  275.  while (strlen(pass) < 14)
  276.    pass += raw_string (0);
  277.  
  278.  pass = toupper (pass);
  279.  
  280.  K1 = substr (pass, 0, 6);
  281.  K2 = substr (pass, 7, 13);
  282.  
  283.  hash = DES (in:"KGS!@#$%", key:K1) + DES (in:"KGS!@#$%", key:K2);
  284.  
  285.  return hash;
  286. }
  287.  
  288.  
  289. function LM_Response (password, challenge)
  290. {
  291.  local_var hash, key1, key2, key3, response;
  292.  
  293.  hash = LM_Hash (password:password);
  294.  reponse[1] = substr (hash, 0, 7) + raw_string (0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
  295.  
  296.  hash += raw_string (0x00,0x00,0x00,0x00,0x00);
  297.  
  298.  key1 = substr (hash, 0, 6);
  299.  key2 = substr (hash, 7, 13);
  300.  key3 = substr (hash, 14, 20);
  301.  
  302.  response[0] = DES (in:challenge, key:key1) + DES (in:challenge, key:key2) + DES (in:challenge, key:key3);
  303.  
  304.  return response;
  305. }
  306.  
  307.  
  308.  
  309.  
  310. #---------------------------------------------------------#
  311. # NTLM 0.12 Challenge/Response                            #
  312. #---------------------------------------------------------#
  313.  
  314.  
  315. function NTLM_Hash (password)
  316. {
  317.  return MD4 (password);
  318. }
  319.  
  320. function NTLM_Response (password, challenge)
  321. {
  322.  local_var hash, key1, key2, key3, response;
  323.  
  324.  hash = NTLM_Hash (password:password);
  325.  
  326.  response[1] = MD4 (hash);
  327.  
  328.  hash += raw_string (0x00,0x00,0x00,0x00,0x00);
  329.  
  330.  key1 = substr (hash, 0, 6);
  331.  key2 = substr (hash, 7, 13);
  332.  key3 = substr (hash, 14, 20);
  333.  
  334.  response[0] = DES (in:challenge, key:key1) + DES (in:challenge, key:key2) + DES (in:challenge, key:key3);
  335.  
  336.  return response;
  337. }
  338.  
  339.  
  340. function NTLMv2_Hash (password, login, domain)
  341. {
  342.  local_var hash, user, dest, data;
  343.  
  344.  hash = NTLM_Hash (password:password);
  345.  user = toupper (login);
  346.  if (domain)
  347.    dest = toupper (domain);
  348.  else
  349.    dest = NULL;
  350.  
  351.  data = user + dest;
  352.  hash = HMAC_MD5 (data:data, key:hash);
  353.  
  354.  return hash;
  355. }
  356.  
  357.  
  358. function NTLMv2_Response (password, login, domain, challenge)
  359. {
  360.  local_var hash, data, blob, hmac, resp, TimeStamp, blip;
  361.  
  362.  hash = NTLMv2_Hash (password:password, login:login, domain:domain);
  363.  
  364.  blip = NULL;
  365.  
  366.  for (i = 0; i < 8; i++)
  367.     blip += raw_string (rand() % 256);
  368.  
  369.  TimeStamp = raw_string (0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00) ; # To change !!
  370.  
  371.  blob = raw_string ( 0x01,                    # Response Type Identification Number
  372.                      0x01,                    # Maximum Response Type Identification Number
  373.              0x00, 0x00,              # Reserved
  374.              0X00, 0x00, 0x00, 0x00 ) # Reserved ?
  375.     +
  376.     TimeStamp
  377.     +
  378.     blip
  379.     +
  380.     raw_string (0x00,0x00,0x00,0x00)  # Unknown value
  381.     +
  382.     raw_string (0x00,0x00,0x00,0x00)  # List of Netbios Name. Emtpy for the moment.
  383.     +
  384.     raw_string (0x00,0x00,0x00,0x00); # Unknown value
  385.     
  386.  data = challenge + blob;
  387.  hmac = HMAC_MD5 (data:data, key:hash);
  388.  resp[0] = hmac + blob;
  389.  resp[1] = HMAC_MD5 (data:hash, key:hmac);
  390.  
  391.  return resp;
  392. }
  393.  
  394.  
  395. function LMv2_Response (password, login, domain, challenge)
  396. {
  397.  local_var hash, data, blob, hmac, resp, TimeStamp, blip;
  398.  
  399.  hash = NTLMv2_Hash (password:password, login:login, domain:domain);
  400.  
  401.  blip = NULL;
  402.  
  403.  for (i = 0; i < 8; i++)
  404.     blip += raw_string (rand() % 256);
  405.  
  406.  data = challenge + blip;
  407.  hmac = HMAC_MD5 (data:data, key:hash);
  408.  resp[0] = hmac + blip;
  409.  resp[1] = HMAC_MD5 (data:hash, key:hmac);
  410.  
  411.  return resp;
  412. }
  413.